跳到主要内容

JZ57 二叉树的下一个结点

https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

第一次解

/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;

TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 1.
if (pNode.right != null) {
TreeLinkNode pRight = pNode.right;
while (pRight.left != null) {
pRight = pRight.left;
}
return pRight;
}
// 2.
if (pNode.next != null && pNode.next.left == pNode) {
return pNode.next;
}
// 3.
if (pNode.next != null) {
TreeLinkNode pNext = pNode.next;
while (pNext.next != null && pNext.next.right == pNext) {
pNext = pNext.next;
}
return pNext.next;
}
return null;
}
}

这题主要讲下思路

其实画个图就很好理解了,就是在第二次递归序的时候打印,其它两次不打印

如下:

      1              
2 3
4 5 6 7

每次只执行第二次

1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 1
^ ^ ^ ^ ^ ^ ^

所以最后打印顺序是:
4 2 5 1 6 3 7

情况一:当前节点存在右节点,那么返回的则是它右边的最左节点,例如这里的 1 节点,下一个节点是 6,

情况二:如果它没有右节点(例如 6),则判断上一层的节点,如果当前是左节点则直接返回当前节点的上一级就行了

情况三:无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。(例如 5)

情况三画个图会比较清晰:

如图:i 的下一个节点是 b

注意,这里取得最左节点使用的是迭代,而不是递归